package NarkyPackage;

import java.awt.Rectangle;
import java.awt.Graphics2D;
import java.awt.Graphics;
import java.awt.Image;

/**
 * Clase cuyas instancias representan a las balas disparadas tanto por el personaje
 * principal como por los malos.
 * 
 * Esta clase esta hecha para poder representar varios tipos de bala, sin embargo
 * por el momento maneja solo un tipo de bala "default", y si hay tiempo se le
 * agregaran mas balas.
 * 
 * @author GameTECH
 * @version 1.0
 *
 */
public class Bala extends ElementoDeNarkyKong {

	private int cont = 5;
	private boolean exploto = false;
	private boolean cayendo = false;
	private int contadorDeCaida = 0;
	private int speed;
	private String tipoDeBala;
	private double rotacionDeBola = 0.0;
	private boolean esDeJugador;
	private Image bola;

	/**
	 * Crea una nueva instancia de bala segun el tipo y direccion que se le pide.
	 * La instancia se agrega a la lista de elementos de juego del Juego que se le
	 * pasa como parametro
	 * 
	 * @param tipoDeBala  El tipo de bala que se esta creando.
	 * @param direccion   La direccion en la que tiene que avanzar la bala en el eje.
	 * 					   x del juego. -1 significa que la bala avanza a la izquierda
	 *                     y 1 significa que avanza hacia la derecha de la pantalla.
	 * @param juego       El juego al que la bala va a pertenecer.
	 */
	public Bala(String tipoDeBala, int direccion, int x, int y, Juego juego, boolean esDeJugador) {
		super(juego);
		this.setDireccion(direccion);

		this.esDeJugador = esDeJugador;

		int multX = 0;
		if (direccion < 0) {
			multX = 1;
			x -= 5;
		} else {
			x += 5;
		}
		this.tipoDeBala = tipoDeBala;
		if (tipoDeBala.equals("bola")){
			bola = juego.applet.cargarImagen("BalaNarky");
			this.setImage(bola);
			this.setRect(new Rectangle (x - multX*31, y, 20, 20));
			speed = 10;
		} else {
			this.setImage(juego.applet.cargarImagen("Bala"));
			this.setRect(new Rectangle (x - multX*20, y, 11, 7));
			speed = 15;
		}
	}

	/**
	 * Explota la bala cuando esta recibe un disparo
	 */
	public void recibirDisparo() {
		Rectangle old = this.getRect();
		int crecer = 4;
		if (tipoDeBala.equals("bola")) {
			crecer = 10;
		}
		this.setRect(new Rectangle ((int)old.getX() - crecer, (int)old.getY() -crecer,
				(int)old.getWidth() + crecer, (int)old.getHeight() + crecer));
		exploto = true;
		juego.applet.sonido.play("explosion");
		juego.addScore(1);
		this.setImage(juego.applet.cargarImagen("ExplosionBalas"));

	}

	/**
	 * Avanza una determinada cantidad de espacio y luego checa si hay algun otro
	 * elemento del juego en su posicion, de haberlo dibuja una animacion de un 
	 * disparo y luego manda a llamar al metodo recibirDisparo() del objeto con el
	 * que se topo.
	 */
	public void actualizar() {
		super.actualizar();
		if (!exploto){
			if (tipoDeBala.equals("bola")) {
				if ((this.getRect().getX() <= 10 && this.getDireccion() < 0) || 
						(this.getRect().getX() + this.getRect().getWidth() >= (juego.getWidth() + 5)) ) {
					this.setDireccion(this.getDireccion() * -1);
				}

				rotacionDeBola += .125 * this.getDireccion();
				if (rotacionDeBola >= 1) {
					rotacionDeBola = 0;
				}
				//Gravedad
				if (!juego.mapa.tengoSoloPiso(this)){
					if (!cayendo) {
						cayendo = true;
						contadorDeCaida = 25;
					}
					if (contadorDeCaida > 20) {
						this.move(5*this.getDireccion(), 5);
					} else if (contadorDeCaida > 15) {
						this.move(4*this.getDireccion(), 5);
					} else if (contadorDeCaida > 10) {
						this.move(3*this.getDireccion(), 5);
					} else if (contadorDeCaida > 5) {
						this.move(2*this.getDireccion(), 5);
					} else if (contadorDeCaida > 0) {
						this.move(1*this.getDireccion(), 5);
					} else {
						this.move(0, 5);
					}
					contadorDeCaida--;
				} else {
					if (cayendo) {
						cayendo = false;
						this.move(-5, 0);
					} else {
						this.move(speed * this.getDireccion(), 0);
					}
				}
			} else {
				this.move(speed * this.getDireccion(), 0);
			}
			ElementoDeNarkyKong e = juego.hayAlguienMas(this);
			if (e != null) {
				if (!(!esDeJugador && !e.tipoDeElemento().equals("Jugador"))){
					recibirDisparo();
					e.recibirDisparo();
					if (tipoDeBala.equals("bola")) {
						e.recibirDisparo();
					}
				}
			}
		} else {
			cont--;
			if (cont < 0)
				juego.removerElemento(this);
		}
	}

	/**
	 * Metodo vacio, las balas no responden al teclado
	 */
	public void keyPressed( int keyPressed) { 
	}


	public boolean ocupaEstaPosicion(Rectangle rect) {
		if (exploto)
			return false;
		else
			return super.ocupaEstaPosicion(rect);
	}

	public String tipoDeElemento() {
		return "Bala";
	}
	
	/**
	 * Si la bala es un barril va haciendo la animacion de la bola rodando.
	 */
	public void dibujar (Graphics g) {
		if (tipoDeBala.equals("bola") && !exploto) {

			Rectangle me = this.getRectIntermedio();
			Graphics2D dibujarBola = (Graphics2D)g;
			double rotacion = rotacionDeBola;
			dibujarBola.rotate(2.0*Math.PI*rotacion, me.getCenterX(),
					me.getCenterY());
			dibujarBola.drawImage(bola, (int)me.getX(),
					(int)me.getY(), (int)me.getWidth(),
					(int)me.getHeight(), null);
			dibujarBola.rotate(-2.0*Math.PI*rotacion, me.getCenterX(),
					me.getCenterY());
		} else {
			super.dibujar(g);
		}
	}


}
